iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 25
0

Day 25-Telegram Bot:Debug

這個功能很重要很重要很重要。

但是因為需要有些基本觀念所以只好放在比較後面再來說,不然其實debug應該要盡量早一點講。

我在最初碰到debug時,還連接收訊息跟傳送訊息都不會,完全搞不懂自己在測什麼,所以說先了解基本接收傳送訊息的方法再來看debug會比較好。

廢話太多了,進入正題吧!

我們來看一下訊息傳送的過程。

使用者在發送訊息之後,透過Webhook傳送POST請求給GAS,同時將訊息轉為JSON格式儲存。

而在GAS接收到POST請求後,就會執行doPost,接著就可以設計各種接收到訊息之後的回覆方法。

而我們現在要做的debug就是要假裝我們傳送訊息給GAS,也就是說不透過Telegram傳送訊息給後台。

為什麼要這樣做呢?

原因很簡單,因為我們如果直接從Telegram傳送訊息的話,如果是在傳送訊息的過程有問題,那GAS就不會跳出錯誤,我們也就找不到問題出在哪裡,而如果是在GAS內部傳送資料的話,假如有問題就會在有問題的地方跳出錯誤提示。

https://ithelp.ithome.com.tw/upload/images/20201005/20130283eb31SnueJt.png

所以說學會怎麼在GAS做好傳送訊息的測試,相當的重要,因為很好用!!

debug

debug大致上運行的流程是這樣子:

使用者從Telegram傳送的訊息
↓←POST方法
GAS的doPost

JSON.parse
↓←debug程式從此進入
進入主程式

現在我們已經瞭解了整個運行的過程了,我們要來假裝從Telegram傳送訊息到GAS,那該傳送什麼呢?

我們以前面幾篇的針對訊息回覆來做個範例,在傳送訊息/shark之後機器人會回覆shark!!!,所以說我們必須要假裝傳送/shark這樣的訊息。

先在跟機器人的對話中傳送/shark,接著我們回到Google試算表來看看收到了甚麼。

{update_id=8.94000219E8, message={date=1.601562903E9, entities=[Ljava.lang.Object;@1844e527, text=/shark, message_id=497.0, from={first_name=昱成, language_code=zh-hant, is_bot=false, id=1.098175067E9, username=toikusen}, chat={type=private, first_name=昱成, username=toikusen, id=1.098175067E9}}}

嗯好有點亂,這個取得的東西也就是我們接收到的訊息,所以說現在我們只要假裝傳了這樣的東西就好了。

直接來看程式碼吧。

我們另外開一個指令碼檔案叫test.gs。

function debug() {
var test = {
    "update_id" : 893999734,
    "message" : {
        "date" : 1600525466,
        "text" : "/shark",
        "from": {
            "language_code" : "zh - hant",
            "username" : "toikusen",
            "first_name" : "昱成",
            "is_bot" : "false",
            "id" : 1098175067
        },
        "chat" : {
            "type" : "private",
            "id" : 1098175067,
            "first_name" : "昱成",
            "username" : "toikusen"
        },
        "message_id" : 260,
    }
}
  var payload = identificar(test);
  start(payload)

格式可以參照我的寫法,但記得要把各項參數跟文字改成你自己的,我可不想收到一些奇怪的訊息。

程式碼中間可以看到我們假裝傳送的訊息有點不太一樣,要在物件上加上雙引號””,否則就不是我們JSON格式的資料,數字或是boolean的話則不需要加上””

接著我們將假裝傳送的訊息放入payload,可以看到我在test前面加上了一個identificar,這個identificar是用來判斷訊息是message還是callback_data,這樣才可以根據接收的訊息執行到對的方法。

如果說你不想寫這個identificar方法,可能你就只想做message訊息的接收不會用到callback_data,那你也可以直接執行你發送訊息的方法。

而這個identificar方法我把它寫在程式碼.gs(doPost方法的下方)。

function identificar(e){
  
  if (e.callback_query){var message = callbackQuery(e);}
  if(e.message){var message = sendtext(e);}
  return message;
}

程式碼應該蠻好理解的,如果是callback_query那就執行callbackQuery方法,如果是message就執行sendtext方法。

當然這邊的sendtext或callbackQuery方法記得要先寫好,不然GAS會不知道要執行什麼東西,要怎麼寫可以參考上一篇的傳送訊息。

好了之後,一樣記得部屬,再來執行debug方法,就可以看到機器人沒有接收到/shark的指令,就直接傳送了一個shark!!!的訊息。

https://ithelp.ithome.com.tw/upload/images/20201005/20130283XMOU5avgEm.png

設斷點除錯

我們可以點下程式碼行數的旁邊,新增一個程式的斷點(紅色圓點),接著按下執行鈕旁邊的偵錯,就會跳到執行偵錯的頁面。

可以看到程式執行到我設定斷點的start(pyload)就停住,而前面儲存的數值都有存進去。

https://ithelp.ithome.com.tw/upload/images/20201005/2013028362XBKZwnpo.png

接著按下停止偵錯右邊的跳入,程式就會接著跑到下個要執行的方法。

再來可以慢慢點選跳入右邊的跳過,程式就會一行一行的執行,直到fetch將訊息傳送至Telegram,這個時候就可以透過這樣來確認程式是在哪裡出了問題。

https://ithelp.ithome.com.tw/upload/images/20201005/20130283O86jv2yltc.png

假設出了問題的話也不要太緊張,透過GAS的錯誤提示(通常)就可以很容易地找到錯誤的地方。

Log

再來還有一個方法,可以用來檢查我們的值有沒有傳入,利用Log。

透過debug將我們假裝要傳入的訊息寫好後,我們可以在我們想要確認有沒有傳入的資料下方加入一行Logger.log(你要確認的資料)。

像是下方這樣。

    if(estringa.message.text === "/shark") {
    payload = {
        "method": "sendMessage",
        'chat_id': chatid,
        'text': 'shark!!!'
      }
      Logger.log(payload.text)
      return payload;
      
    }


這樣在我們執行完之後我們就可以按下Crtl+Enter來查看Log。

https://ithelp.ithome.com.tw/upload/images/20201005/20130283HmMZwvYmcK.png

只要在任何想要確認的地方都可以加入Log,透過這個方法一層一層檢查,假設沒有值或是傳入的值是錯的那就可以知道是在這個地方出了問題。

另外要特別注意Log的式子要放在return前面,不然就會抓不到資料。

以上就是在GAS內部debug的一些方法,比起直接在Telegram傳送了訊息卻完全毫無反應,這個方法可以讓你透過錯誤提示來找到一些修改的方向,如此一來就可以避免出錯卻完全不知道該從何修改的狀況。


上一篇
Day 24-Telegram Bot:針對對特定訊息回覆
下一篇
Day 26-Telegram Bot:Google以圖搜圖
系列文
利用Google App Script 實作Telegram Bot30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言